package top.jbxie.raft.register;

import lombok.SneakyThrows;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import top.jbxie.raft.nodeCommon.NodeConfig;
import top.jbxie.raft.service.impl.IPServiceImpl;
import top.jbxie.raft.util.Node;
import top.jbxie.raft.util.impl.DefaultNode;

import java.util.Arrays;

@Component
public class MyApplicationRunner implements ApplicationRunner {

    @SneakyThrows
    @Override
    public void run(ApplicationArguments args) throws Exception {
//        String[] peerAddr = {"localhost:8775","localhost:8776","localhost:8777", "localhost:8778", "localhost:8779"};//集群列表
//
//        NodeConfig config = new NodeConfig();
//
//        //自身节点地址
//        config.setSelfAddr(Integer.valueOf(System.getProperty("serverPort")).intValue());
//        //config.setSelfAddr(8779);
//
//        //所有节点地址
//        config.setPeerAddrs(Arrays.asList(peerAddr));
//
//        Node node = DefaultNode.getInstance();
//
//        node.setConfig(config);
//
//        node.init();
//
//        // 为Java应用程序添加退出事件处理
//        // 通过Runtime.getRuntime().addShutdownHook（Thread hook）方法，事件监听，捕获系统退出消息到来，向Java虚拟机
//        // 注册一个shutdown钩子事件，这样程序一旦运行到此处，就运行线程hook。
//        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
//            try {
//                node.destroy();
//            } catch (Throwable throwable) {
//                throwable.printStackTrace();
//            }
//        }));
        IPServiceImpl ipServiceImpl = new IPServiceImpl();

        NodeConfig config = new NodeConfig();

        Thread.currentThread().sleep(20000);

        // 自身节点地址
        config.setSelfAddr(ipServiceImpl.getSelfIp());

        // 所有节点地址
//         Long clusterId = 11113l;
//         config.setPeerAddrs(Arrays.asList(ipServiceImpl.getIpList(clusterId, "sate")));
        String[] peerAddr = {"10.10.1.2:8775","10.10.1.3:8775","10.10.1.4:8775", "10.10.1.5:8775", "10.10.1.6:8775", "10.10.1.7:8775", "10.10.1.8:8775"};//集群列表
        config.setPeerAddrs(Arrays.asList(peerAddr));

        Node node = DefaultNode.getInstance();

        node.setConfig(config);

        node.init();

        // 为Java应用程序添加退出事件处理
        // 通过Runtime.getRuntime().addShutdownHook（Thread hook）方法，事件监听，捕获系统退出消息到来，向Java虚拟机
        // 注册一个shutdown钩子事件，这样程序一旦运行到此处，就运行线程hook。
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            try {
                node.destroy();
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
        }));
    }
}
